RubyKaigi 2022 Day 2 Packet analysis with mruby on Wireshark - dRuby as example
渋いyuiseki.icon
Wiresharkのメイン画面
Packet List
Packet Details
Packet Bytes
Wiresharkのサポートプロトコルはたくさん
Protocol dissectorを自作すれば任意のプロトコルをWiresharkで解剖可能
Wiresharkの公式ドキュメントにはdissectorのチュートリアルがある
CとLuaのAPIのみ
Rubyでdissectorを作れるWiresharkを作ってみた
mrubyを組み込む
dRubyを解析するのがゴール
Wiresharkのなかでdissectorは二回動く
起動時
通信発生時
Wireshark dissectorに必要な機能
パケット解析情報を登録
パケットの構造を見てどのプロトコルなのか判別
パケットの内部の詳細な構造定義
拡張Wireshark
mrubyでWireshark dissector書ける
subというので解析内容を入れ子にできる
...etc
どうやってWiresharkを拡張したのか
WiresharkがRubyコードを理解できるようにする
Wiresharkが起動時にRubyコードを読み込めるようにする
WiresharkはCで書かれている
mrubyを組み込む
Wiresharkをフォーク
git submoduleでmrubyを追加
WiresharkはCMake
CMakeいじってmrubyを見つけられるようにする
code:c
ws_handoff...?
code:c
mrb_ws_protocol_start()
code:ruby
WSProtocol.configure
code:c
mrb_ws_protocol_config()
code:ruby
WSProtocol.register
code:c
ws_protocol_register()
code:c
ws_protocol_set_members()
code:c
proto_register_protocol()
proto_register_field_array()
proto_register_subtree_array()
code:c
ws_protocol_dissector()
Distributed Ruby
マシンA
class Foo
def bar
foo = Foo.new
DRb.start_service("druby://...", foo)
マシンB
foo = DRbObject.new_with_uri("druby://...")
foo.bar
実はWiresharkにはdRuby解析がデフォルトである
せっかくなのでmrubyでdRubyを解析したい
DRb
DRbMessage
send_request
Marshal.dump
send_reply
WiresharkでMarshal.dumpを解析したい
Size of data
Type of data
Integer value of data
String value of data
Marshal formatで定義されている
nil
true
false
Integer
Synbol
etc
dissector
Responseを先にやる
6バイト目を探す
true or falseになってたらResponse
7バイト目を探す
Size of data
13バイト目を探す
Type of data
Demo
a.rbとb.rb
機材調整中
なぜ今回Wiresharkに興味を持ったのか?
ネットワークプロトコルに興味を持ったから
好きなTCPコントロールフレームはなんですか?
FIN
好きなRFCの番号はなんですか?
まだそのレイヤーまで行けていない